/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 比较器.Comparator接口;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @description 定制排序
 *  当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码，
 *      或者实现了java.lang.Comparable接口的排序规则不适合当前的操作，那
 *      么可以考虑使用 Comparator 的对象来排序，强行对多个对象进行整体排
 *      序的比较。
 *  重写compare(Object o1,Object o2)方法，比较o1和o2的大小：如果方法返
 *      回正整数，则表示o1大于o2；如果返回0，表示相等；返回负整数，表示
 *      o1小于o2。
 *  可以将 Comparator 传递给 sort 方法（如 Collections.sort 或 Arrays.sort），
 *      从而允许在排序顺序上实现精确控制。
 *  还可以使用 Comparator 来控制某些数据结构（如有序 set或有序映射）的
 *      顺序，或者为那些没有自然顺序的对象 collection 提供排序。
 * @author 俊昭
 * @date 2022/4/17
*/
public class ComparatorTest {
    @Test
    public void t(){
        // String 包装类等的定制排序
        String[] arr = new String[]{"aa","bb","gg","cc","zz","dd","oo"};
        Arrays.sort(arr, new Comparator<Object>() {
            // 按照字符串从大到小的顺序
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof String&&o2 instanceof String){
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    return - s1.compareTo(s2);
                }
                throw  new RuntimeException("错误的类型输入");
            }
        });
        System.out.println(Arrays.toString(arr));

    }
    @Test
    public void t2(){
        // 自定义类的
        Goods[] arr =new Goods[6];
        arr[0] = new Goods("Razer",200);
        arr[1] = new Goods("Samsung",200);
        arr[2] = new Goods("Lenovo",150);
        arr[3] = new Goods("Xiaomi",99);
        arr[4] = new Goods("Samsung",150);
        arr[5] = new Goods("Razer",198);

        Arrays.sort(arr, new Comparator<Object>() {
            // 产品名称升序 价格降序
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Goods&& o2 instanceof Goods){
                    Goods g1= (Goods) o1;
                    Goods g2= (Goods) o2;

                    int flag = g1.getName().compareTo(g2.getName());
                    if (flag!=0) {
                        return flag;
                    }else{
                        int x = g1.getPrice();
                        int y = g2.getPrice();
                        return -((x>y)?1:((x==y)?0:-1));
                    }

                }

                throw  new RuntimeException("错误的类型输入");
            }
        });
        System.out.println(Arrays.toString(arr));

    }
}
class Goods{
    private String name;
    private int price;

    public Goods(String name, int price) {
        this.price = price;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }
}